/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.editparts;

import com.architexa.org.eclipse.draw2d.RangeModel;
import com.architexa.org.eclipse.draw2d.Viewport;
import com.architexa.org.eclipse.draw2d.geometry.Rectangle;
import com.architexa.org.eclipse.gef.GraphicalEditPart;
import com.architexa.org.eclipse.gef.MouseWheelHelper;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;



/**
 * ViewportMouseWheelHelper is the default MouseWheelHelper that should be used to scroll
 * edit parts.
 * @author Pratik Shah
 * @since 3.1
 */
public class ViewportMouseWheelHelper
	extends ViewportHelper
	implements MouseWheelHelper
{
	
private static final int LINE_HEIGHT = 12;

private int lineHeight, pageHeight;

/**
 * Constructor 
 * @param part the EditPArt that has to be scrolled
 */
public ViewportMouseWheelHelper(GraphicalEditPart part) {
	this(part, -1, -1);
}

/**
 * 
 * Constructor
 * @param part the EditPart that has to be scrolled
 * @param lineHeight the new line height
 * @param pageHeight the new page height
 * @see #setLineHeight(int)
 * @see #setPageHeight(int)
 */
public ViewportMouseWheelHelper(GraphicalEditPart part, int lineHeight, int pageHeight) {
	super(part);
	setLineHeight(lineHeight);
	setPageHeight(pageHeight);
}

/**
 * Finds the viewport of the given EditPart and scrolls it as requested.  If it can't
 * be scrolled then leaves doit to be true so that the given EditPart's ancestors might
 * have a chance to scroll.
 * @see com.architexa.org.eclipse.gef.MouseWheelHelper#handleMouseWheelScrolled(org.eclipse.swt.widgets.Event)
 */
public void handleMouseWheelScrolled(Event event) {
	Viewport viewport = findViewport(owner);
	if (viewport == null || !viewport.isShowing())
		return;
	RangeModel rModel = viewport.getVerticalRangeModel();
	if (rModel.getExtent() < (rModel.getMaximum() - rModel.getMinimum())) {
		int currentPos = rModel.getValue();
		int scrollHeight = lineHeight;
		if (event.detail == SWT.SCROLL_PAGE)
			scrollHeight = pageHeight > lineHeight ? pageHeight : Math.max(lineHeight, 
					viewport.getClientArea(Rectangle.SINGLETON).height - 26); 
		scrollHeight *= event.count;
		viewport.setVerticalLocation(currentPos - scrollHeight);
		if (rModel.getValue() != currentPos)
			event.doit = false;
	}
}

/**
 * Sets the height (in pixels) that will be scrolled when 
 * {@link SWT#SCROLL_LINE line scrolling} is requested.  If the line height is set to 0 or
 * less, or not set at all, a default height will be used.
 * 
 * @param height the new line height
 */
public void setLineHeight(int height) {
	if (height > 0)
		lineHeight = height;
	else
		lineHeight = LINE_HEIGHT;
}

/**
 * Sets the height (in pixels) that will be scrolled when 
 * {@link SWT#SCROLL_PAGE page scrolling} is requested.  A page height that is less than 
 * the line height will not be respected.  If the page height is set to -1, or one is not
 * set at all, the default height will be used.  The default height is calculated based
 * on the given EditPart's figure's viewport's size.  It will not be less than the line
 * height.
 * 
 * @param height the new page height
 */
public void setPageHeight(int height) {
	pageHeight = height;
}

}
